トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     ステージ上のムービークリップをMovieClipクラスのサブクラスに変換(?)する
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
Tonpoo (gaienboy改め)
Åê¹ÆNo.35282
投稿日時: 2007-9-27 17:17
職人
居住地: 東京・神宮前
投稿: 713
使用環境:
Windows Vista SP1,
Flash CS3 Pro,
Flash Player 10.0.22.87
ステージ上のムービークリップをMovieClipクラスのサブクラスに変換(?)する
こんにちは、gaienboyです。

ステージ上に配置してあるムービークリップを、カスタムクラス(MovieClipクラスの
サブクラス)として扱う方法について躓いています。以下、ちょっと長文になります。

※追記:ActionScript2.0で開発しています

ヘルプ「ActionScript 2.0 の学習」の「継承>継承について」で、下記の記述がありました。
引用:
サブクラスは、"スーパークラス" のすべてのプロパティとメソッドを継承します。


そこで、TestClassというクラスと、その拡張であるSubTestClassというクラスを作って
検証し、SubTestClassからTestClassのインスタンスメソッドが使えることを確認しました。

TestClass.asの記述
//クラス定義
class TestClass{
	// コンストラクタ
	function TestClass(){
	}
	// インスタンスメソッド
	function TestFunc():Void{
		trace("TestFunc実行");
	};
}

SubTestClass.asの記述
//クラス定義
class SubTestClass extends TestClass{
	// コンストラクタ
	function SubTestClass(){
	}
	// インスタンスメソッド
	function SubTestFunc():Void{
		trace("SubTestFunc実行");
	};
}

Flaファイルの記述
var myTest:SubTestClass = new SubTestClass();
myTest.TestFunc();	//"TestFunc実行"を出力=スーパークラスのメソッドを実行
myTest.SubTestFunc();	//"SubTestFunc実行"を出力

これで、サブクラスからスーパークラスのメソッドが呼び出せていることを確認しました。

次に、MovieClipクラスのサブクラスを作りました。

SubMovieClip.asの記述
//クラス定義
class SubMovieClip extends MovieClip{
	// コンストラクタ
	function SubMovieClip(){
	}
	// インスタンスメソッド
	function SubMovieClipFunc():Void{
		trace("SubMovieClipFunc実行");
	};
}


そして、ステージ上に配置してあるムービークリップ「bar_mc」をSubMovieClip
クラスに変換(?)して、SubMovieClipクラスのインスタンスメソッドと、
スーパークラスであるMovieClipクラスのプロパティを呼び出してみようと考えました。

トライ1:
bar_mcがステージ上のbar_mcを参照していないため(?)、
bar_mcの_xプロパティを取得できず失敗
bar_mc = new SubMovieClip();
bar_mc.SubMovieClipFunc();	//"SubMovieClipFunc実行"を出力
trace(bar_mc._x);	//undefined


トライ2:
コンストラクタに渡したbar_mcが宙ぶらりんになっているため(?)、
bar_mcの_xプロパティを取得できず失敗
var myBar:SubMovieClip = new SubMovieClip(bar_mc);
myBar.SubMovieClipFunc();	//"SubMovieClipFunc実行"を出力
trace(myBar._x);	//undefined


ライブラリにあるbar_mcシンボルのリンケージで「クラス」にSubMovieClipを
指定したら、SubMovieClipクラスのインスタンスメソッドとMovieClipクラスのプロパティ
の両方を扱うことができました。

トライ3:
bar_mc.SubMovieClipFunc();	//"SubMovieClipFunc実行"を出力
trace(bar_mc._x);	//"200"を出力


コンストラクタでSubMovieClipインスタンスを作る時に、元となる(?)
ムービークリップにSubMovieClipのインスタンスメソッドをコピーしたところ、
bar_mcからSubMovieClipFuncメソッドを呼び出せるようにはなりました。
ただし、myBarから、スーパークラスであるMovieClipクラスのプロパティに
アクセスすることはできません。

SubMovieClip.asの記述(変更後)
//クラス定義
class SubMovieClip extends MovieClip{
	var my_mc:MovieClip;	
	// コンストラクタ
	function SubMovieClip(mc:MovieClip){
		my_mc = mc;
		my_mc.SubMovieClipFunc = SubMovieClipFunc;
	}
	// インスタンスメソッド
	function SubMovieClipFunc():Void{
		trace("SubMovieClipFunc実行");
	};
}


トライ4:
var myBar:SubMovieClip = new SubMovieClip(bar_mc);
bar_mc.SubMovieClipFunc();	//"SubMovieClipFunc実行"を出力
trace(bar_mc._x);	//"200"を出力
myBar.SubMovieClipFunc();	//"SubMovieClipFunc実行"を出力
trace(myBar._x);	//undefined


トライ3のように、「bar_mc」を指定して、MovieClipクラスのプロパティ・
メソッドも、SubMovieClipクラスのプロパティ・メソッドも両方使えるのが
現在の目標です。これを、「ライブラリのシンボルにクラスをリンケージする」
のではなく、「ステージ上のムービークリップに動的にクラスをリンケージする」
という方法がないものかと思って、悩んでいます。

ヘルプの「ActionScript 2.0 の学習」の「クラス」と「継承」、ならびに
野中先生のテクニカルノート「オブジェクト指向プログラミング」の項目は
目を通したつもりです。が、見落としや勘違いがある可能性も大です(汗)。

クラスの勉強を始めてまだ間もないので、基本的な考え方に問題があるのかも
しれないのですが、そのあたりも含め、識者の皆様のご意見・アドバイスを
いただけたらと思います。

長文、失礼しました


----------------
Tonpoo (a.k.a. gaienboy)
Tonpoo.com / TONPOOBLOG / twitter@tonpootwit

ニノミヤ カズノリ
Åê¹ÆNo.35284
投稿日時: 2007-9-27 21:09
職人
居住地: 東京
投稿: 430
使用環境:
CS4
.4.11, .5.7
XP Pro(sp3)
Flash Player 10,0,22,87,
AIR 1.5.1,
IE 5.5 & 6 & 7 & 8,
Firefox 2.0.0.20 & 3.0.11 & 3.5,
Opera 9.64,
Safari 4,
Google Chrome 2.0.172.31,
Netscape 7.1
Re: ステージ上のムービークリップをMovieClipクラスのサブクラスに変換(?)する
引用:
トライ1:
bar_mcがステージ上のbar_mcを参照していないため(?)、
bar_mcの_xプロパティを取得できず失敗
bar_mc = new SubMovieClip();
bar_mc.SubMovieClipFunc();	//"SubMovieClipFunc実行"を出力
trace(bar_mc._x);	//undefined

MovieClipをnew演算子にて生成すると、機能しないし、表示もされないというのはご存知でしょうか?
トライ1にて_xプロパティを参照しようとしてundefinedだった理由はここにあります。
これらのプロパティは、createEmptyMovieClip等の関数を使用して初めて代入されます。
その為、MovieClipを継承したSubMovieClipをnew演算子にて生成しても、_xプロパティを参照する事はできません。

引用:
SubMovieClip.asの記述(変更後)
//クラス定義
class SubMovieClip extends MovieClip{
	var my_mc:MovieClip;	
	// コンストラクタ
	function SubMovieClip(mc:MovieClip){
		my_mc = mc;
		my_mc.SubMovieClipFunc = SubMovieClipFunc;
	}
	// インスタンスメソッド
	function SubMovieClipFunc():Void{
		trace("SubMovieClipFunc実行");
	};
}


トライ4:
var myBar:SubMovieClip = new SubMovieClip(bar_mc);
bar_mc.SubMovieClipFunc();	//"SubMovieClipFunc実行"を出力
trace(bar_mc._x);	//"200"を出力
myBar.SubMovieClipFunc();	//"SubMovieClipFunc実行"を出力
trace(myBar._x);	//undefined

また、トライ4の場合、
bar_mcを拡張したオブジェクトがmyBarに入る訳ではありません。
結局のところ、new演算子によって生成されたSubMovieClipのインスタンスが代入されてしまいます。
この事から、やはり_xプロパティは参照する事ができません。
(といっても、今回の場合myBar.my_mc._xで参照できます)

「ステージ上のムービークリップに動的にクラスをリンケージする」との事ですが、既存の関数では無かったと思います。
(シンボルにクラスを登録するならObject.regiterClassがありますが、今回の場合違いますね。)


ちょっと考えてみたんですが、こんなのはどうでしょう。

SubMovieClip.as
class SubMovieClip extends MovieClip {
	
	private function SubMovieClip() {}
	
	public static function extend(mc:MovieClip):Void
	{
		mc.__proto__ = SubMovieClip.prototype;
	}
	
	public function SubMovieClipFunc():Void
	{
		trace("SubMovieClipFunc実行");
	}
}


root
var mc = createEmptyMovieClip("test_mc", getNextHighestDepth());
mc._x = 20;

SubMovieClip.extend(mc);	//ムービークリップを拡張
mc.SubMovieClipFunc();
trace(mc._x);


やろうとしてる事はSubMovieClip.as(変更後)と同じですが、SubMovieClipのプロパティやメソッドを一括で代入できるので楽かなと
野中文雄
Åê¹ÆNo.35285
投稿日時: 2007-9-27 21:40
ちょんまげら
居住地: 東京
投稿: 4247
使用環境:
CS4 .4.11 Vista Home Premium (SP1)
Re: ステージ上のムービークリップをMovieClipクラスのサブクラスに変換(?)する
ActionScript 1.0スタイルの処理を使う必要があるでしょう。

参考:「ActionScript 2.0と1.0の継承について
引用:
gaienboyさんは書きました:
次に、MovieClipクラスのサブクラスを作りました。

SubMovieClip.asの記述
//クラス定義
class SubMovieClip extends MovieClip{
	// コンストラクタ
	function SubMovieClip(){
	}
	static function inherit(_mc:MovieClip):Void {
		_mc.__proto__ = SubMovieClip.prototype;
		_mc.__proto__.__constructor__ = SubMovieClip;
	}
	// インスタンスメソッド
	function SubMovieClipFunc():Void{
		trace("SubMovieClipFunc実行");
	};
}

...[中略]...
トライ2:
コンストラクタに渡したbar_mcが宙ぶらりんになっているため(?)、
bar_mcの_xプロパティを取得できず失敗
// var myBar:SubMovieClip = new SubMovieClip(bar_mc);
SubMovieClip.inherit(bar_mc);
myBar.SubMovieClipFunc();	//"SubMovieClipFunc実行"を出力
trace(myBar._x);	//undefined

ActionScript 2.0や3.0では、クラスはMovieClipを継承することなく、下記のようにMovieClipインスタンスをインスタンスプロパティとして設定し、インスタンスメソッドでそのMovieClipに対して処理を行うというかたちになるのではないかと思います。

その中間として、mix-inの手法も選択肢としてはありえます。
引用:
コンストラクタでSubMovieClipインスタンスを作る時に、元となる(?)
ムービークリップにSubMovieClipのインスタンスメソッドをコピーしたところ、
bar_mcからSubMovieClipFuncメソッドを呼び出せるようにはなりました。
ただし、myBarから、スーパークラスであるMovieClipクラスのプロパティに
アクセスすることはできません。

SubMovieClip.asの記述(変更後)
//クラス定義
class SubMovieClip{  // extends MovieClip{
	var my_mc:MovieClip;	
	// コンストラクタ
	function SubMovieClip(mc:MovieClip){
		my_mc = mc;
		// ...[後略]...


----------------
 

Tonpoo (gaienboy改め)
Åê¹ÆNo.35292
投稿日時: 2007-9-28 0:45
職人
居住地: 東京・神宮前
投稿: 713
使用環境:
Windows Vista SP1,
Flash CS3 Pro,
Flash Player 10.0.22.87
Re: ステージ上のムービークリップをMovieClipクラスのサブクラスに変換(?)する
こんばんは、gaienboyです。ニノミヤさん、レスありがとうございました!

引用:
ニノミヤ カズノリさんは書きました:
MovieClipをnew演算子にて生成すると、機能しないし、表示もされないというのはご存知でしょうか?
トライ1にて_xプロパティを参照しようとしてundefinedだった理由はここにあります。
これらのプロパティは、createEmptyMovieClip等の関数を使用して初めて代入されます。
その為、MovieClipを継承したSubMovieClipをnew演算子にて生成しても、_xプロパティを参照する事はできません。

そうか!!AS2.0までのMovieClipに、new演算子で生成するためのコンストラクタメソッドが
無いということは、ついこの間セミナーでも学んだのですが、故にその拡張であるSubMovieClip
クラスも、new演算子で生成しても、スーパークラスであるMovieClipのインスタンスプロパティや
メソッドを持ってこれるわけではないんですね。「MovieClipクラスにはコンストラクタメソッドが
ないのに、どうやってsuper(mc)みたいにすればいいのだろう?」って思っていたんです。

引用:
(といっても、今回の場合myBar.my_mc._xで参照できます)

ああ、これも目からウロコでした。そうか、「myBar.my_mc」でいけるんですね。

引用:
「ステージ上のムービークリップに動的にクラスをリンケージする」との事ですが、既存の関数では無かったと思います。
(シンボルにクラスを登録するならObject.regiterClassがありますが、今回の場合違いますね。)

ふむふむ。「Object.regiterClass」も未見でした。ヘルプをざっと(ホントに「ざっと」)見て
見たのですが、あとでまた改めてじっくり読んでみます。

引用:
ちょっと考えてみたんですが、こんなのはどうでしょう。
     (中略)
mc.__proto__ = SubMovieClip.prototype;

「__proto__」と「prototype」を使うやり方!上記の野中先生の投稿中にもある、
AS1.0形式の方法ですね。なるほど、こんなやり方もあるのか!
参考にさせていただきます!


----------------
Tonpoo (a.k.a. gaienboy)
Tonpoo.com / TONPOOBLOG / twitter@tonpootwit

Tonpoo (gaienboy改め)
Åê¹ÆNo.35294
投稿日時: 2007-9-28 5:29
職人
居住地: 東京・神宮前
投稿: 713
使用環境:
Windows Vista SP1,
Flash CS3 Pro,
Flash Player 10.0.22.87
Re: ステージ上のムービークリップをMovieClipクラスのサブクラスに変換(?)する
こんばんは、gaienboyです。野中先生、レスをありがとうございました!!

引用:
野中文雄さんは書きました:
ActionScript 1.0スタイルの処理を使う必要があるでしょう。
参考:「ActionScript 2.0と1.0の継承について

テクニカルノート、拝見しました。そして、やはり読み落としていました・・・(汗)。

引用:
ActionScript 2.0や3.0では、クラスはMovieClipを継承することなく、下記のようにMovieClipインスタンスをインスタンスプロパティとして設定し、インスタンスメソッドでそのMovieClipに対して処理を行うというかたちになるのではないかと思います。

なるほど。今までの考え方を変える必要がありますね。

引用:
その中間として、mix-inの手法も選択肢としてはありえます。

リンク先、早速訪問しました。・・・が、まだ読み終えていません(汗)。
頑張って読んで身に付けます


----------------
Tonpoo (a.k.a. gaienboy)
Tonpoo.com / TONPOOBLOG / twitter@tonpootwit

スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops